package Sparse_Arrays_01;

import Sparse_Arrays_01.Entity.ChestData;

import org.junit.Test;

import java.util.List;

public class test_01 {
    public static final String XML_FILE_PATH = "/Users/luo/Desktop/chess.xml";
    @Test
    public void sparseArray() {

        int[][] primaryArray = new int[11][10];
        primaryArray[2][3] = 1;
        primaryArray[2][8] = 2;
        int validCount = 0;
        for (int[] ints : primaryArray) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
                if (anInt != 0) {
/*
        获取稀疏数组的思路
        1.遍历原始的二维数组 获取有效数据的个数validCount
*/
                    validCount++;
                }
            }
            System.out.println();
        }
/*        ------->转为对象数组
        2.根据validCount创建稀疏数组，[0]用来存储还原原数组的信息
            一维数组的三个元素分别用来存储棋子的x坐标,y坐标,value
 */
        int[][] sparseArray = new int[validCount+1][3];
/*
            初始化第0个二维数组，用于存储还原原始数组的信息
                第0个二维数组的三个一维数组元素分别存储原始数组的行、列、棋子的个数（有效值的个数，非0值的个数）

 */
        sparseArray[0][0] = primaryArray.length;
        sparseArray[0][1] = primaryArray[0].length;
        sparseArray[0][2] = validCount;
//      3.1将二维数组的有效数据存储到稀疏数组
        int k = 1; //用于记录第几个非0数据
        for (int i = 0; i < primaryArray.length; i++) {
            for (int j = 0; j < primaryArray[i].length; j++) {
                int valid = primaryArray[i][j];
                if(valid != 0){

//                    存储x坐标
                        sparseArray[k][0] = i;
//                    存储y坐标
                        sparseArray[k][1] = j;
//                    存储x，y坐标对应的值
                        sparseArray[k][2] = valid;
//                  存储完一个有效值之后，稀疏数组的二维坐标+1，存储下一个坐标
                    k++;

                }
            }
        }
        System.out.println("遍历稀疏数组");
        for (int[] ints : sparseArray) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }

        toPrimaryArray(sparseArray);
//        storageToObject(primaryArray,validCount);
    }



    public void toPrimaryArray(int[][] sparseArray){
//        根据稀疏数据的第0行数据创建原始数组
        int[][] primaryArray = new int[sparseArray[0][0]]  [sparseArray[0][1]];

        for (int i = 1; i < sparseArray[0].length; i++) {
            primaryArray[sparseArray[i][0]] [sparseArray[i][1]] = sparseArray[i][2];
        }

        System.out.println("遍历原始数组");
        for (int i = 0; i < primaryArray.length; i++) {
            for (int j = 0; j < primaryArray[i].length; j++) {
                System.out.print(primaryArray[i][j]+"\t");
            }
            System.out.println();
        }
    }



    public void storageToObject(int[][] primaryArray, int validCount){

        //        ------->转为稀疏对象数组
//      2.根据validCount创建稀疏数组，[0]用来存储还原原数组的信息
        ChestData[] parse = new ChestData[validCount + 1];
        for (int i = 0; i < parse.length; i++) {
//          不能使用加强for循环来给对象数组 创建对象
            parse[i] = new ChestData();
        }

//        设置第0行的参数-->
        parse[0].setColumn(primaryArray.length);
        parse[0].setRow(primaryArray[0].length);
        parse[0].setValue(validCount);
        validCount = 0;
        for (int i = 0; i < primaryArray.length; i++) {
            for (int j = 0; j < primaryArray[i].length; j++) {
                if (primaryArray[i][j] != 0) {
//      3.将二维数组的有效数据存储到稀疏对象数组
                    validCount++;
                    parse[validCount].setRow(j);
                    parse[validCount].setColumn(i);
                    parse[validCount].setValue(primaryArray[i][j]);
                }
            }
        }


        for (ChestData chestData : parse) {
            System.out.println(chestData);
        }

        new CreateXmlFile().createXml(parse);
//        从文件获取
        System.out.println("从文件获取");
        List<ChestData> parseFromFile = new ReadXmlFile().readXml();
//          遍历，顺便将ArrayList转为数组
        ChestData[] chestData = new ChestData[parseFromFile.size()];

        for (int i = 0; i < parseFromFile.size(); i++) {
            System.out.println(parseFromFile.get(i));
            chestData[i] = parseFromFile.get(i);
        }

        new RecoverFromSparseArray().recoverFromParseArray(chestData);
    }





}








